package com.water.note.service;

import com.water.note.common.PageResult;
import com.water.note.dto.TodoDTO;
import com.water.note.entity.Todo;

import java.util.List;
import java.util.Map;

/**
 * 待办事项服务接口
 */
public interface TodoService {
    
    /**
     * 创建待办事项
     *
     * @param todo 待办事项信息
     * @return 创建后的待办事项
     */
    TodoDTO createTodo(Todo todo);
    
    /**
     * 更新待办事项
     *
     * @param todo 待办事项信息
     * @return 更新后的待办事项
     */
    TodoDTO updateTodo(Todo todo);
    
    /**
     * 删除待办事项
     *
     * @param todoId 待办事项ID
     * @param userId 用户ID
     * @return 是否删除成功
     */
    boolean deleteTodo(Long todoId, Long userId);
    
    /**
     * 获取待办事项详情
     *
     * @param todoId 待办事项ID
     * @return 待办事项详情
     */
    TodoDTO getTodoById(Long todoId);
    
    /**
     * 分页查询待办事项
     *
     * @param page 页码
     * @param pageSize 每页记录数
     * @param userId 用户ID
     * @param status 状态
     * @param keyword 关键字
     * @return 分页结果
     */
    PageResult<TodoDTO> pageTodos(Integer page, Integer pageSize, Long userId, Integer status, String keyword);
    
    /**
     * 查询今日待办事项
     *
     * @param userId 用户ID
     * @return 待办事项列表
     */
    List<TodoDTO> listTodayTodos(Long userId);
    
    /**
     * 查询未完成且已过期的待办事项
     *
     * @param userId 用户ID
     * @return 待办事项列表
     */
    List<TodoDTO> listOverdueTodos(Long userId);
    
    /**
     * 更新待办事项状态
     *
     * @param todoId 待办事项ID
     * @param userId 用户ID
     * @param status 状态
     * @return 是否更新成功
     */
    boolean updateTodoStatus(Long todoId, Long userId, Integer status);
    
    /**
     * 更新提醒状态
     *
     * @param todoId 待办事项ID
     * @param userId 用户ID
     * @param isReminded 是否已提醒
     * @return 是否更新成功
     */
    boolean updateRemindStatus(Long todoId, Long userId, Boolean isReminded);
    
    /**
     * 获取待办事项概览数据（总数和完成进度）
     *
     * @param userId 用户ID
     * @return 概览数据
     */
    Map<String, Object> getOverviewData(Long userId);
    
    /**
     * 获取最近的待办事项
     *
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 待办事项列表
     */
    List<TodoDTO> getRecentTodos(Long userId, int limit);
} 